﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using skhukb.Models;
using skhukb.BL;
using skhukb.DB;

namespace skhukb.Controllers
{
    [Authorize]
    public class SubjectController : Controller
    {
        [HttpGet]
        public ActionResult Detail(long ID)
        {
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.FirstOrDefault(p => p.ID == ID);
                if (주제 == null) return HttpNotFound(Consts.주제없음);
                var 전산소사람인가 = 현재사용자.사용자.전산소 || 현재사용자.사용자.관리자;
                var 글목록 = 주제.글.Where(p => p.상태 == Consts.최신버전 && (p.전산소만 == false || 전산소사람인가)).OrderBy(p => p.순서).ThenBy(p => p.ID).Select(p => new 글Model(p, 내용포함: true)).ToList();
                var 상위주제목록 = new List<주제Model>();
                var n = 주제.상위주제;
                while (true) {
                    상위주제목록.Insert(0, new 주제Model(n));
                    if (n.ID == 주제BL.ROOT.ID) break;
                    n = n.상위주제;
                }
                return View(new SubjectDetailModel { 
                    주제 = new 주제Model(주제), 
                    상위주제목록 = 상위주제목록, 
                    하위주제목록 = 주제.하위주제.Where(p => p.제거 == false && p.ID != p.상위주제ID).Select(p => new 주제Model(p)).ToList(), 
                    글목록 = 글목록 });
            }
        }

        [HttpGet]
        public ActionResult Removed(long ID)
        {
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.FirstOrDefault(p => p.ID == ID);
                if (주제 == null) return HttpNotFound(Consts.주제없음);
                var 글목록 = 주제.글.Where(p => p.상태 == Consts.제거상태의최신버전).OrderBy(p => p.순서).ThenBy(p => p.ID).Select(p => new 글Model(p, 내용포함: true)).ToList();
                return View(new SubjectDetailModel {
                    주제 = new 주제Model(주제),
                    상위주제목록 = null,
                    하위주제목록 = 주제.하위주제.Where(p => p.제거).Select(p => new 주제Model(p)).ToList(), 글목록 = 글목록
                });
            }
        }

        [HttpGet]
        public ActionResult History(long ID)
        {
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.FirstOrDefault(p => p.ID == ID);
                if (주제 == null) return HttpNotFound(Consts.주제없음);
                var 그룹목록 = 주제.글.GroupBy(p => p.코드);
                var 글목록 = new List<SubjectHistory_글Model>();
                foreach (var 그룹 in 그룹목록) {
                    var 최신글 = 그룹.FirstOrDefault(p => p.상태 == Consts.최신버전 || p.상태 == Consts.제거상태의최신버전);
                    if (최신글 == null) {
                        최신글 = 그룹.Where(p => p.편집유형 == Consts.글편집).OrderByDescending(p => p.ID).First();
                        최신글.상태 = Consts.제거상태의최신버전;
                        db.SubmitChanges();
                    }
                    글목록.Add(new SubjectHistory_글Model(최신글, 제거됨: 최신글.상태 == Consts.제거상태의최신버전, 편집수: 그룹.Count()));
                }
                글목록 = 글목록.OrderBy(p => p.순서).ThenBy(p => p.ID).ToList();
                var 편집목록 = 주제.주제편집.Select(p => new 주제편집Model(p)).ToList();
                return View(new SubjectHistoryModel { 
                    주제 = new 주제Model(주제), 
                    상위주제 = new 주제Model(주제.상위주제), 
                    글목록 = 글목록, 편집목록 = 편집목록 });
            }
        }

        [HttpGet]
        public ActionResult Sort(long ID)
        {
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.FirstOrDefault(p => p.ID == ID);
                if (주제 == null) return HttpNotFound(Consts.주제없음);
                var 목록 = 주제.글.Where(p => p.상태 == Consts.최신버전).OrderBy(p => p.순서).ThenBy(p => p.ID).Select(p => new 글Model(p)).ToList();
                return View(new SubjectSortModel { 주제 = new 주제Model(주제), 글목록 = 목록 });
            }
        }

        [skhukb.Util.AjaxOnly] [HttpPost]
        public ActionResult Sort(long ID, string order) // Referenced By: Sort.cshtml
        {
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.FirstOrDefault(p => p.ID == ID);
                if (주제 == null) return Json(new JsonModel { success = false, message = Consts.주제없음 });

                bool changed = false;
                var 글ID목록 = order.Split(',');
                for (int i = 0; i < 글ID목록.Count(); ++i) {
                    long 글ID = 0;
                    long.TryParse(글ID목록[i], out 글ID);
                    var 글 = db.글.FirstOrDefault(p => p.ID == 글ID);
                    if (글 == null) continue;
                    foreach (var a in db.글.Where(p => p.주제ID == 글.주제ID && p.코드 == 글.코드))
                        if (a.순서 != i + 1) {
                            a.순서 = i + 1;
                            changed = true;
                        }
                }
                if (changed == false) return Json(new JsonModel { success = false, message = "변경 사항이 없습니다" });

                string 변경전내용 = 주제변경내역.목차순서내용(db, 주제.ID);
                db.SubmitChanges();
                string 변경후내용 = 주제변경내역.목차순서내용(db, 주제.ID);
                주제변경내역.목차순서변경(db, 주제.ID, 변경전내용, 변경후내용);
                db.SubmitChanges();

                return Json(new JsonModel { success = true, url = Url.SubjectDetail(ID) });
            }
        }

        [skhukb.Util.AjaxOnly] [HttpPost]
        public ActionResult CreateChild(long parentID, string title) // Referenced By: _CreateChild.cshtml
        {
            using (var db = new DBDataContext()) {
                var 형제주제 = db.주제.Where(p => p.상위주제ID == parentID);
                int 번호 = (형제주제.Count() == 0) ? 1 : 형제주제.Max(p => p.번호) + 1;
                var 새주제 = new 주제 { 상위주제ID = parentID, 제목 = title, 번호 = 번호 };
                db.주제.InsertOnSubmit(새주제);
                db.SubmitChanges();

                string s = 새주제.제목;
                주제 n = 새주제.상위주제;
                while (n.제목 != "ROOT") {
                    s = n.제목 + "/" + s;
                    n = n.상위주제;
                }
                새주제.총제목 = "/" + s;

                주제변경내역.주제생성(db, 새주제);
                db.SubmitChanges();
                return Json(new JsonModel { success = true, url = Url.SubjectDetail(parentID) });
            }
        }

        [skhukb.Util.AjaxOnly] [HttpPost]
        public ActionResult Delete(long ID)
        {
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.FirstOrDefault(p => p.ID == ID);
                if (주제 == null) return Json(new JsonModel { success = false, message = Consts.주제없음 });
                if (주제.ID == 주제BL.ROOT.ID) return Json(new JsonModel { success = false, message = Consts.권한없음 });

                if (주제.하위주제.Count() == 0 && 주제.글.Count() == 0) {
                    var 상위주제ID = 주제.상위주제ID;
                    db.주제편집.DeleteAllOnSubmit(주제.주제편집);
                    db.책갈피.DeleteAllOnSubmit(주제.책갈피);
                    db.덧글.DeleteAllOnSubmit(db.덧글.Where(p => p.대상구분 == Consts.덧글대상_주제 && p.대상ID == ID));
                    db.주제.DeleteOnSubmit(주제);
                    db.SubmitChanges();

                    return Json(new JsonModel { success = true, url = Url.SubjectDetail(상위주제ID) });
                } else {
                    주제.제거 = true;
                    주제변경내역.주제제거(db, 주제);
                    db.SubmitChanges();
                    return Json(new JsonModel { success = true, url = Url.SubjectDetail(ID) });
                }
            }
        }

        [skhukb.Util.AjaxOnly] [HttpPost]
        public ActionResult Undelete(long ID)
        {
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.FirstOrDefault(p => p.ID == ID);
                if (주제 == null) return Json(new JsonModel { success = false, message = Consts.주제없음 });

                주제.제거 = false;
                주제변경내역.주제제거취소(db, 주제);
                db.SubmitChanges();
                return Json(new JsonModel { success = true, url = Url.SubjectDetail(ID) });
            }
        }

        [skhukb.Util.AjaxOnly] [HttpPost]
        public ActionResult Move(long ID, long parentID)  // Referenced By: _Move.cshtml
        { 
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.FirstOrDefault(p => p.ID == ID);
                if (주제 == null) return Json(new JsonModel { success = false, message = Consts.주제없음 });
                if (주제.ID == 주제BL.ROOT.ID) return Json(new JsonModel { success = false, message = Consts.권한없음 });

                var 새상위주제 = db.주제.FirstOrDefault(p => p.ID == parentID);
                if (새상위주제 == null) return Json(new JsonModel { success = false, message = Consts.주제없음 });

                if (주제BL.이동가능한가(db, 주제, 새상위주제) == false)
                    return Json(new JsonModel { success = false, message = Consts.이동불가 });

                string 변경전상위주제명 = 주제.상위주제.총제목;
                주제.상위주제 = 새상위주제;
                주제BL.총제목갱신(db);
                string 변경후상위주제명 = 주제.상위주제.총제목;

                주제변경내역.주제이동(db, 주제.ID, 변경전상위주제명, 변경후상위주제명);
                db.SubmitChanges();
                return Json(new JsonModel { success = true, url = Url.SubjectDetail(ID) });
            }
        }

        [Authorize(Roles = MyRoleProvider.ADMIN)]
        public ActionResult CalcTitle()
        {
            using (var db = new DBDataContext()) {
                주제BL.총제목갱신(db);
                db.SubmitChanges();
                return View(db.주제.ToList());
            }
        }

        [skhukb.Util.AjaxOnly] [HttpPost]
        public ActionResult Rename(long ID, string title) // Referenced By: _Rename.cshtml
        {
            using (var db = new DBDataContext()) {
                var 주제 = db.주제.FirstOrDefault(p => p.ID == ID);
                if (주제 == null) return Json(new JsonModel { success = false, message = Consts.주제없음 });
                if (주제.ID == 주제BL.ROOT.ID) return Json(new JsonModel { success = false, message = Consts.권한없음 });
                
                string 변경전제목 = 주제.제목;
                주제.제목 = title;
                주제BL.총제목갱신(db);
                string 변경후제목 = 주제.제목;

                주제변경내역.주제명변경(db, 주제.ID, 변경전제목, 변경후제목);
                db.SubmitChanges();
                return Json(new JsonModel { success = true, url = Url.SubjectDetail(ID) });
            }
        }

        [HttpGet]
        public ActionResult TreeView()
        {
            using (var db = new DBDataContext()) {
                var ROOT = db.주제.Single(p => p.ID == 주제BL.ROOT.ID);
                return View(new 주제TreeModel(ROOT));
            }
        }

    }
}
